﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

/// <summary>
/// 数据类型：
/// 菜鸟教程：
/// https://www.runoob.com/csharp/csharp-data-types.html
/// 官方文档：
/// https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/builtin-types/value-types
/// </summary>
namespace _02_datatype
{
    class Program
    {
        static void Main(string[] args)
        {
            //ValuesType();
            //StringType();
            StringPrint();
        }

        /// <summary>
        /// 显示转换
        /// </summary>
        static void TypeConvertForce()
        {
            int i = 75;
            float f = 53.005f;
            double d = 2345.7652;
            bool b = true;

            Console.WriteLine(i.ToString());
            Console.WriteLine(f.ToString());
            Console.WriteLine(d.ToString());
            Console.WriteLine(b.ToString());

            Console.ReadKey();
        }

        /// <summary>
        /// 类型转换
        /// https://www.runoob.com/csharp/csharp-type-conversion.html
        /// </summary>
        static void TypeConvertImplicit()
        {
            double d = 5673.74;
            int i;

            // 强制转换 double 为 int
            i = (int)d;
            Console.WriteLine(i);// 5673

            Console.ReadKey();
        }

        /// <summary>
        /// 字符串格式化输出
        /// </summary>
        static void StringPrint()
        {
            var array = new int[] { 1, 2, 3 };
            Console.WriteLine("格式化输出方法一----类似python中的f string输出方式");
            foreach (var a in array)
            {
                Console.WriteLine($"A is {a}");
            }

            Console.WriteLine("格式化输出方法二----类似format输出方式");
            foreach (var a in array)
            {
                Console.WriteLine("A is {0}", a);
            }

            Console.WriteLine("格式化输出方法三----类似字符串拼接+的输出方式");
            foreach (var a in array)
            {
                Console.WriteLine("A is " + a.ToString());
            }

            Console.WriteLine("格式化输出方法四----类似format输出方式");
            // same as method 2, but String.Format keyword can be leaved out
            foreach (var a in array)
            {
                Console.WriteLine(String.Format("A is {0}", a));
            }

            Console.ReadKey();
        }

        /// <summary>
        /// 字符串类型
        /// </summary>
        static void StringType()
        {
            String str = "runoob.com";
            Console.WriteLine(str);

            // C# string 字符串的前面可以加 @（称作"逐字字符串"）将转义字符（\）当作普通字符对待
            string str2 = @"C:\Windows";
            Console.WriteLine(str2);

            string str3 = "C:\\Windows";
            Console.WriteLine(str3);

            Console.WriteLine(str2 == str3);// True

            // @ 字符串中可以任意换行，换行符及缩进空格都计算在字符串长度之内。
            string str4 = @"<script type=""text/javascript"">
                <!--
                -->
            </script>";
            Console.WriteLine(str4);

            Console.ReadKey();
        }

        /// <summary>
        /// dynamic类型
        /// 您可以存储任何类型的值在动态数据类型变量中。这些变量的类型检查是在运行时发生的。
        /// 动态类型与对象类型相似，但是对象类型变量的类型检查是在编译时发生的，而动态类型变量的类型检查是在运行时发生的。
        /// </summary>
        static void DynamicType()
        {
            dynamic d = 20;
            Console.WriteLine(d);

            Console.ReadKey();
        }

        /// <summary>
        /// 值类型
        /// </summary>
        static void ValuesType()
        {
            bool success = true;
            Console.WriteLine(success);

            // 8 位无符号整数 0 到 255
            byte bt = 127; 
            Console.WriteLine(bt);

            // 16 位 Unicode 字符	U +0000 到 U +ffff
            char ch = 'A';
            Console.WriteLine(ch);

            //decimal	128 位精确的十进制值，28-29 有效位数	(-7.9 x 10^28 到 7.9 x 10^28) / 100 到 28
            decimal dec = 300000.0M;
            Console.WriteLine(dec);

            //double	64 位双精度浮点型	(+/-)5.0 x 10^-324 到 (+/-)1.7 x 10^308
            double dou = 1600.89D;
            Console.WriteLine(dou);

            //float	32 位单精度浮点型	-3.4 x 10^38 到 + 3.4 x 10^38
            float flo = 1600.89F;
            Console.WriteLine(flo);

            //int	32 位有符号整数类型	-2,147,483,648 到 2,147,483,647
            int integer = 1000;
            Console.WriteLine(integer);

            //long	64 位有符号整数类型	-9,223,372,036,854,775,808 到 9,223,372,036,854,775,807
            long lon = 1000L;
            Console.WriteLine(lon);

            //sbyte   8 位有符号整数类型 - 128 到 127
            sbyte sbt = 127;
            Console.WriteLine(sbt);

            //short	16 位有符号整数类型	-32,768 到 32,767
            short shor = 32767;
            Console.WriteLine(shor);

            //uint	32 位无符号整数类型	0 到 4,294,967,295
            uint UnsignInteger = 32767;
            Console.WriteLine(UnsignInteger);

            //ulong	64 位无符号整数类型	0 到 18,446,744,073,709,551,615
            ulong UnsignLong = 327679876;
            Console.WriteLine(UnsignLong);

            // ushort	16 位无符号整数类型	0 到 65,535
            ushort ushor = 65535;
            Console.WriteLine(ushor);

            Console.ReadKey();
        }
    }
}
